// 中文介绍: 测试赛事管理中对赛事的编辑，仅测试球队管理人员和球员的增删改查

import puppeteer from 'puppeteer';
import clipboardy from 'clipboardy';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import { keyboard, Key, mouse, screen } from "@nut-tree/nut-js";
import { findAndClickElementByText, clickFormItemContent, findLabelAndInputText } from '../utils/index.js'
import { loginToAdmin } from '../utils/login.js';
import { logInfo, logError } from '../utils/logger.js'

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const assetsPath = join(__dirname, '../assets');

keyboard.config.autoDelayMs = 100; // 设置延迟，确保稳定

const username = '13800000000';
const password = 'BJZX2024';

// 定义一个变量： 赛事名称
const eventName = '赛事名称111111';

// 管理人员假数据
const managerData = {
  managerName: '范兴兴',
  gender: '男',
  managerBirth: '2003-05-20',
  managerAddress: '北京市海淀区',
  duty: '领队',
  validPeriod: ['2021-03-09', '2031-03-09'],
  managerPhone: '15622893176',
  managerIdCard: '411325200305204934',
  // 近期免冠证件照
  managerHeadshot: join(assetsPath, '/manager/晓米/近期免冠证件照.jpg'),
  managerIdCardFront: join(assetsPath, '/manager/晓米/身份证正面照.jpg'),
  managerIdCardBack: join(assetsPath, '/manager/晓米/身份证反面照.jpg'),
};

// 定义一些球员和球队的假数据
const teamData = {
  teamName: 'Test Team',
  teamDesc: 'This is a test team for automation testing.'
};

const playerData = {
  playerName: 'Test Player',
  playerPosition: 'Forward',
  playerNumber: 10
};

// 主函数
async function testEventManagement() {
  // 启动浏览器
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();

  await page.setViewport({ width: 1397, height: 658 });

  // 1. 登录后台
  await loginToAdmin(page, username, password);

  await sleep(1000)

  // 打开赛事管理页面
  await findAndClickElementByText(page, 'li.el-menu-item span', '赛事管理')

  // 找到要点击的赛事
  await findAndClickElementByText(page, 'span.el-link--inner', eventName)

  // 进入报名球队页面 
  await findAndClickElementByText(page, 'li.el-menu-item', '报名球队')

  // 选择一个球队
  await findAndClickElementByText(page, 'span.el-link--inner', '球队名称')

  // 等待 元素 div.headimgurl-preview borcolorgreen 加载完成
  await page.waitForSelector('div.headimgurl-preview.borcolorgreen')

  // 新增管理人员
  await addManager(page)

  logInfo('🎉 测试新增管理人员完成！')

  // 关闭浏览器
  // await browser.close();
}

// 新增管理人员
async function addManager(page) {
  // 找到并点击 "添加管理人员" 按钮
  await findAndClickElementByText(page, 'button.el-button.el-button--primary.el-button--mini', '添加管理人员');

  await clickFormItemContent(page, '证件照人像面：');

  await sleep(1000)
  await selectFile(managerData.managerIdCardFront)
  await sleep(1000)

  await clickFormItemContent(page, '证件照国徽面：');
  await sleep(1000)
  await selectFile(managerData.managerIdCardBack)

  await clickFormItemContent(page, '近期免冠证件照：');
  await sleep(1000)
  await selectFile(managerData.managerHeadshot)

  await sleep(1000)

  findLabelAndInputText(page, '姓名：', managerData.managerName)
  findLabelAndInputText(page, '性别：', '女')
  findLabelAndInputText(page, '住址：', managerData.managerAddress)
  findLabelAndInputText(page, '证件号码：', managerData.managerIdCard)
  await sleep(1000)

  findLabelAndInputText(page, '手机号（必填）：', managerData.managerPhone)
  findLabelAndInputText(page, '球队职务（必填）：', '领队')
  await sleep(1000)

  findLabelAndInputText(page, '出生：', managerData.managerBirth)
  findLabelAndInputText(page, '有效期限：', ['2021-03-09', '2031-03-09'])
  await sleep(1000)

  await findAndClickElementByText(page, 'label.el-checkbox .el-checkbox__label', '本人已阅读以上内容，并确认填写信息完整和真实，同意提交。')
  await sleep(3000)

  await page.evaluate(() => {
    const buttons = document.querySelectorAll('button.el-button.el-button--primary');
    for (const button of buttons) {
      if (button.textContent.trim() === '保 存') {
        button.click();
      }
    }
  });
}

async function selectFile(path) {
  // // 将路径复制到剪贴板
  clipboardy.writeSync(path);

  // // 模拟 Ctrl + V 进行粘贴
  await keyboard.pressKey(Key.LeftControl, Key.V);
  await keyboard.releaseKey(Key.LeftControl, Key.V);

  // 执行确认操作
  await pressAltO();

  // 模拟按下 'Enter' 键
  // await keyboard.pressKey(Key.Enter);
  // await keyboard.releaseKey(Key.Enter);
}

async function pressAltO() {
  // 模拟按下 Alt + O 组合键
  await keyboard.pressKey(Key.LeftAlt, Key.O);
  await keyboard.releaseKey(Key.LeftAlt, Key.O);
}

async function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

// 调用主函数
testEventManagement().catch(error => {
  console.error("Test failed:", error);
});
